package com;

import java.net.Socket;
import java.sql.Connection;

/**
 * 用内部静态类来实现, Singleton6 中并没有 instance 静态变量,而是放到了静态内部类Holder中,
 * 所以在 Singleton6初始化的时候并不会创建 Singleton6 的实例,
 * Holder 中定义了 Singleton6 的实例并直接进行了初始化,
 * 当 Holder 被主动使用的时候就会创建 Singleton6 的实例,
 * Singleton6 的实例的创建过程在java程序编译的时期手机到 <clinit>() 中, 这个方法又是同步方法
 * 同步方法可以保证内存的可见性,jvm指令的顺序性和原子性
 *
 */
public final class Singleton6 {
    // 实例变量
    private String name = "1234";
    private Connection conn;
    private Socket socket;

    // 私有化构造函数, 不允许外部new
    private Singleton6() {
    }

    /**
     * 静态内部类, 只会被初始化一次
     * 并且是懒加载的方式, 在调用的时候才会被初始化
     */
    private static class Holder {
        private static Singleton6 instance = new Singleton6();
    }

    // 调用 getInstance方法,事实上就是获取 Holder 的静态属性
    public static Singleton6 getInstance() {
        return Holder.instance;
    }
}
